package com.wbc.utils;

import java.lang.reflect.Method;

/**
 *这是一个压力测试工具 可以制定方法启动指定线程和次数
 * @author wangbingchen
 * @DATE: 2022/8/22
 */

/**
 * 用于测试后续可删除
 */
class Test{
    public void ttt(){
        System.out.println("ttt");
    }
}

public class ThreadTestUtil {

    /**
     * 用于测试后续可删除
     */
    public static void main(String[] args) {
        ThreadTestUtil.myThreadUtil(Test.class,"ttt",2,3);
    }

    /**
     *
     * @param threadTestClass 运行的类
     * @param name 需要执行的方法名称
     * @param threadNum 创建线程的数量
     * @param oneThreadTime 每个线程执行的次数
     */
    public static void myThreadUtil(Class<?> threadTestClass, String name, int threadNum, int oneThreadTime) {
        Method method;
        Object o;
       try{
           //获得类的私有方法
           method = threadTestClass.getDeclaredMethod(name, (Class<?>[]) null);
           //没有设置就会报错,因为权限访问异常
           method.setAccessible(true);
           //调用该方法
           o = threadTestClass.newInstance();
       }catch (Exception e){
           System.out.println("调用方法失败");
           return;
       }

        for (int i = 0; i < threadNum; i++) {
            Method finalMethod = method;
            Object finalO = o;
            new Thread(() ->{
                for (int j = 0; j < oneThreadTime; j++) {
                    try {
                        finalMethod.invoke(finalO);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }

}
